﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Api.index
{
    internal class Parser
    {
        // 指定一个加载文档的路径
        private const string INPUT_PATH = "D:\\desktop\\GeekDesk-master\\API\\resource\\api";
        
        private static List<FileInfo> filelist = new List<FileInfo>();
        public void run()
        {
            // 整个 Parser 类的入口
            // 1. 根据上面指定的路径，枚举出所有的文件(html)，这个过程需要把所有子目录中的文件都能获取到
            
            enumFile(INPUT_PATH);
            // 2. 针对上面罗列出的文件路径，打开文件，读取文件内容，并进行解析，并构建索引
            foreach (FileInfo file in filelist)
            {
                parserHTML(file);
            }
            // 3. 把在内存中构造好的索引数据结构，保存到指定的文件中。
            
        }

        

        private void enumFile(string inputPath)
        {
            FileInfo[] files = new DirectoryInfo(inputPath).GetFiles(".",SearchOption.AllDirectories);
            foreach (FileInfo file in files)
            {
                if (file.Name.EndsWith(".js")) continue;
                filelist.Add(file);
                //Console.WriteLine(file.DirectoryName.Replace("\\\\", "/")+file.Name);
            }
            
        }

        private void parserHTML(FileInfo f)
        {
            // 1. 解析出 HTML 的标题
            string title = parserTitle(f);
            // 2. 解析出 HTML 对应的 URL
            string url = parserURL(f);
            // 3. 解析出 HTML 对应的正文（有了正文才有后续的描述）
            string content = parserContentByRegex(f);
            Index.index.addDoc(title, url, content);
            //Console.WriteLine(content.Substring(0,20));
        }

        private string parserTitle(FileInfo f)
        {
            string name = f.Name;
            return name.Replace(".html", "");               
        }
        public string parserURL(FileInfo f)
        {
            string part1 = "https://docs.oracle.com/en/java/javase/20/docs/api/";
            string part2 = f.DirectoryName.Replace("\\","/").Replace("D:/desktop/GeekDesk-master/API/resource/api/", "");
            return part1 + part2+"/"+f.Name;
        }
        public string parserContentByRegex(FileInfo f)
        {
            Regex reg1 = new Regex(@"<script.*?>(.*?)</script>");
            Regex reg2 = new Regex(@"<.*?>");
            Regex reg3 = new Regex(@"\s\s\s*");
            // 1. 把整个文件都读到 String 里面
            string content = File.ReadAllText(f.DirectoryName+"\\"+f.Name);
            // 2. 替换掉 script 标签
            content = reg1.Replace(content, " ");
            //content.Replace(@"<script.*?>(.*?)</script>", " ");
            // 3. 替换掉普通的 html 标签
            //content = content.Replace("<.*?>", " ");
            content = reg2.Replace(content, " ");
            // 4. 使用正则把多个空格合成一个
            content = reg3.Replace(content, " ");
            return content;
        }
    }
}
